package com.fmy.springbootutils.tool;

import com.alibaba.fastjson.JSONObject;
import com.fmy.springbootutils.format.JSONFormat;
import com.fmy.springbootutils.unusual.BusinessException;
import lombok.extern.slf4j.Slf4j;

import java.io.*;
import java.util.List;

/**
 * @author Mr.fmy
 * @version 1.0.0
 * @ClassName JSONFileTool.java
 * @Description TODO json文件操作以及生成
 * @createTime 2019年07月09日 16:40:00
 */
@Slf4j
public class JSONFileTool {
    /**
     * 生成.json格式文件
     */
    public static boolean createJsonFile(String jsonString, String filePath, String fileName) {
        // 标记文件生成是否成功
        boolean flag = true;
        // 拼接文件完整路径
        String fullPath = filePath + File.separator + fileName + ".json";
        // 生成json格式文件
        try {
            // 保证创建一个新文件
            File file = new File(fullPath);
            if (!file.getParentFile().exists()) { // 如果父目录不存在，创建父目录
                file.getParentFile().mkdirs();
            }
            if (file.exists()) { // 如果已存在,删除旧文件
                file.delete();
            }
            file.createNewFile();
            // 格式化json字符串
            jsonString = JSONFormat.formatJson(jsonString);
            // 将格式化后的字符串写入文件
            Writer write = new OutputStreamWriter(new FileOutputStream(file), "UTF-8");
            write.write(jsonString);
            write.flush();
            write.close();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
            flag = false;
        }
        // 返回是否成功的标记
        return flag;
    }

    /**
     * 读取json文件，返回json串
     */
    public static String readJsonFile(String filePath) {
        File jsonFile = new File(filePath);
        if (!jsonFile.exists()) {
            throw new BusinessException("未找到：" + filePath);
        }
        try {
            return readJsonFile(new FileInputStream(jsonFile));
        } catch (FileNotFoundException e) {
            log.error(e.getMessage(), e);
            return null;
        }
    }

    /**
     * 读取json文件，返回json串
     */
    public static String readJsonFile(InputStream inputStream) {
        try {
            Reader reader = new InputStreamReader(inputStream, "utf-8");
            int ch = 0;
            StringBuffer sb = new StringBuffer();
            while ((ch = reader.read()) != -1) {
                sb.append((char) ch);
            }
            reader.close();
            return sb.toString();
        } catch (IOException e) {
            log.error(e.getMessage(), e);
            return null;
        }
    }

    public static <T> T readJsonFile(String filePath, Class<T> c) {
        String json = readJsonFile(filePath);
        return JSONObject.parseObject(json, c);
    }

    public static <T> List<T> readJsonFileArray(String filePath, Class<T> c) {
        String json = readJsonFile(filePath);
        return JSONObject.parseArray(json, c);
    }
}
